package com.example.hilt.model

import com.example.hilt.annotation.BindElectricEngine
import com.example.hilt.annotation.BindGasEngine
import com.example.hilt.callBack.Engine
import com.example.hilt.impl.ElectricEngine
import com.example.hilt.impl.GasEngine
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent

/**
 ********************************************************
 *Author: chinadragon
 *Time: 2023/9/7 10:32
 *Name:
 *Overview:
 *Usage:
 ********************************************************
 */
@Module// 表示这一个用于提供依赖注入实例的模块。
@InstallIn(ActivityComponent::class) //把这个模块安装到Activity组件当中
abstract class EngineModule {
    /*
        https://mp.weixin.qq.com/s/OEX1d2cU1zGG5BBM-nANBg

        抽象函数的返回值必须是Engine，表示用于给Engine类型的接口提供实例

        bindEngine()函数接收了GasEngine参数，也就是说，会将GasEngine的实例提供给Engine接口。

        最后，在抽象函数上方加上@Bind注解，这样Hilt才能识别它。

        解决 Engine被绑定了多次 问题
        将两个为Engine接口提供实例的函数进行了分类，一个分到了@BindGasEngine注解上，一个分到了@BindElectricEngine注解上。

        增加了Qualifier注解之后，所有为Engine类型进行依赖注入的地方也需要去声明注解，明确指定自己希望注入哪种类型的实例。
     */

    @BindGasEngine
    @Binds
    abstract fun bindGasEngine(gasEngine: GasEngine): Engine

    @BindElectricEngine
    @Binds
    abstract fun bindElectricEngine(electricEngine: ElectricEngine): Engine
}